/*******************************************************************************
版权声明: Copyright(C) HT-Tech Co., Ltd. 2024-2026. All rights reserved.
文件名称: htTcp.h
文件描述: TCP服务模块定义
创 建 者: 陈位仅
创建时间: 2024年11月26日
修改历史:
1. 2024年11月26日   陈位仅      创建文件 
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#include "htmacro.h"
#include "httcp.h"

// 服务初始化
int httcp_init(IN char *pIP, IN short port)
{
    int rv = 0;
    int fd = 0;
    int opt = 1;
    struct sockaddr_in addr;

    // 参数校验
    if (NULL == pIP || 0 == port) {
        return -1;
    }

    // 创建监听套接字
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket error");
        return -1;
    }

    // 端口复用
    rv = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    if (rv < 0) {
        perror("setsockopt error");
        close(fd);
        return -1;
    }

    // 绑定
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    inet_pton(AF_INET, pIP, &addr.sin_addr.s_addr);

    // 绑定端口
    rv = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(rv == -1) {
        perror("bind error");
        close(fd);
        return -1;
    }

    // 监听
    rv = listen(fd, 1);
    if(rv == -1) {
        perror("listen error");
        close(fd);
        return -1;
    }

    return fd;
}

// 服务释放
int httcp_deinit(int fd)
{
    close(fd);
    return 0;
}
